#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 19-6-3 下午10:00
# @Author  : Tom
# @Site    : 
# @File    : get_spec_list.py
# @Software: PyCharm


def get_spec_list(sku):
    # 获取商品详情页面中：详细规格选项对象列表
    # 获取规格具体信息 和 sku_id的对应信息
    '''
             {
                 选项:sku_id
             }
             说明：键的元组中，规格的索引是固定的
             示例数据如下：
             {
                 (1,3):1,
                 (2,3):2,
                 (1,4):3,
                 (2,4):4
             }
     '''
    spu = sku.spu.order_by('id')
    # 陈列商品的商品规格
    specs = spu.specs.order_by('id')
    # 获取当前产品的库存产品skus
    skus = spu.sku_set.order_by('id')

    # 保存当前的规格选项和sku_id
    sku_options = {}
    # 保存当前的规格选项的列表
    sku_option = []
    # 获取当前的库存产品，并以规格信息来进行保存
    for sku_temp in skus:
        # 当前规格选项的列表信息 [option1,option2]
        option_key = []
        # 获取sku的详细规格信息eg:
        infors = sku_temp.specs.order_by('spec_id')
        #  SKU的ID                      规格的ID      选项的ID
        # 1 - -荣耀10 （黑 + 4 + 64）    1 - -颜色     1 - -黑
        # 1 - -荣耀10 （黑 + 4 + 64）    2 - -配置     3 - -4 + 64
        # 遍历详细规格信息
        for info in infors:
            # option_key添加规格选项
            option_key.append(info.option_id)
            if sku_temp.id == sku.id:
                # 获取当前的规格信息的选项信息
                sku_option.append(info.option_id)
        # 保存 键：规格信息对象的列表， 值是sku.id就是库存信息的id号的字典
        sku_options[tuple(option_key)] = sku_temp.id
    print(sku_option)  # 保存的选项信息
    print(sku_options)  # 规格信息的对象

    ''' 返回的spece_list列表
           [
            spec1,spec2,
             ]
     '''

    # 遍历当前spu所有的规格
    specs_list = []

    # specs = spu.specs.order_by ('id')
    # 获取当前所有的spu商品规格：p1:颜色，配置
    for index, spec in enumerate(specs):
        # 选项列表信息
        option_list = []
        # 遍历选项信息
        for option in spec.options.all():
            # 如果当前商品为蓝、64,则列表为[2,3]
            sku_option_temp = sku_option[:]
            # sku_option_temp = sku_option 不使用这样的方法是它会地址赋值，如果sku_option_temp改变，而sku_option也会改变
            # [13, 20]  < class 'list'>  # [14, 20]  < class 'list'>

            # 替换对应索引的元素：规格的索引是固定的[1,3]
            # 颜色对应的id号
            sku_option_temp[index] = option.id
            # 为选项添加sku_id属性，用于在html中输出链接
            option.sku_id = sku_options.get(tuple(sku_option_temp), 0)
            # 添加选项对象
            option_list.append(option)
        # 为规格对象添加选项列表
        spec.option_list = option_list
        # 重新构造规格数据
        specs_list.append(spec)
    return specs_list
